package common

import (
	"bytes"
	"errors"
	"gitee.com/kinwyb/appTools/log"
	"github.com/tealeg/xlsx"
)

var (
	ExeclFileDecodeFail = errors.New("execl文件解析失败")
	ExeclFileEmpty      = errors.New("execl文件空")
)

//execl导出文件后缀
const execlSuffix = ".xlsx"

// Execl 操作
// 使用第三方库: github.com/xuri/excelize
type Execl struct {
	execl *xlsx.File `description:"execl对象"`
}

// NewExecl 新建一个execl对象
func NewExecl() *Execl {
	return &Execl{}
}

// GetSheet 新建工作页
func (e *Execl) GetSheet(name string) *xlsx.Sheet {
	if e.execl == nil {
		e.execl = xlsx.NewFile()
	}
	if _, ok := e.execl.Sheet[name]; !ok {
		e.execl.AddSheet(name)
	}
	return e.execl.Sheet[name]
}

// NextRow 循环输出,如果回调函数返回false停止创建下一行结束
func (e *Execl) NextRow(sheetname string, f func(row *xlsx.Row, i int) bool) {
	if f != nil {
		if sheetname == "" {
			sheetname = "Sheet1"
		}
		if e.execl == nil {
			e.execl = xlsx.NewFile()
		}
		if _, ok := e.execl.Sheet[sheetname]; !ok {
			e.execl.AddSheet(sheetname)
		}
		sheet := e.execl.Sheet[sheetname]
		i := 0
		for {
			row := sheet.AddRow()
			if !f(row, i) {
				return
			}
			i++
		}
	}
}

// Save 保存如果未指定文件名自动生成,如果未有任何操作返回空
func (e *Execl) Save() ([]byte, error) {
	if e.execl == nil {
		return nil, nil
	}
	bf := bytes.NewBufferString("")
	err := e.execl.Write(bf)
	return bf.Bytes(), err
}

// ExeclRowGetCell 获取一个单元格
func ExeclRowGetCell(row *xlsx.Row, style *xlsx.Style) *xlsx.Cell {
	cell := row.AddCell()
	if style != nil {
		cell.SetStyle(style)
	}
	return cell
}

//ImportExecl 导入execl文件
func ImportExecl(filebytes []byte) ([][]string, error) {
	file, err := xlsx.OpenBinary(filebytes)
	if err != nil {
		log.AppTool.Errorf("解析Execl文件异常:%s", err.Error())
		return nil, ExeclFileDecodeFail
	}
	outputdata, err := file.ToSlice()
	if err != nil {
		log.AppTool.Errorf("读取Execl文件异常:%s", err.Error())
		return nil, ExeclFileDecodeFail
	}
	if len(outputdata) > 0 && len(outputdata[0]) > 1 {
		return outputdata[0], nil
	}
	return nil, ExeclFileEmpty
}
